/*
 * jqDnR - Minimalistic Drag'n'Resize for jQuery.
 *
 * Copyright (c) 2007 Brice Burgess <bhb@iceburg.net>, http://www.iceburg.net
 * Licensed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 * 
 * $Version: 2007.08.19 +r2
 */
/*jshint eqeqeq:false */
/*global jQuery, define */
(function (factory) {
    "use strict";
    if (typeof define === "function" && define.amd) {
        // AMD. Register as an anonymous module.
        define([
            "jquery"
        ], factory);
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {
    "use strict";
//module begin
    $.fn.jqDrag = function (h) {
        return i(this, h, 'd');
    };
    $.fn.jqResize = function (h, ar) {
        return i(this, h, 'r', ar);
    };
    $.jqDnR = {
        dnr: {},
        e: 0,
        drag: function (v) {
            if (M.k == 'd') {
                E.css({left: M.X + v.pageX - M.pX, top: M.Y + v.pageY - M.pY});
            }
            else {
                E.css({width: Math.max(v.pageX - M.pX + M.W, 0), height: Math.max(v.pageY - M.pY + M.H, 0)});
                if (M1) {
                    E1.css({width: Math.max(v.pageX - M1.pX + M1.W, 0), height: Math.max(v.pageY - M1.pY + M1.H, 0)});
                }
            }
            return false;
        },
        stop: function () {
            //E.css('opacity',M.o);
            $(document).unbind('mousemove', J.drag).unbind('mouseup', J.stop);
        }
    };
    var J = $.jqDnR, M = J.dnr, E = J.e, E1, M1,
        i = function (e, h, k, aR) {
            return e.each(function () {
                h = (h) ? $(h, e) : e;
                h.bind('mousedown', {e: e, k: k}, function (v) {
                    var d = v.data, p = {};
                    E = d.e;
                    E1 = aR ? $(aR) : false;
                    // attempt utilization of dimensions plugin to fix IE issues
                    if (E.css('position') != 'relative') {
                        try {
                            E.position(p);
                        } catch (e) {
                        }
                    }
                    M = {
                        X: p.left || f('left') || 0,
                        Y: p.top || f('top') || 0,
                        W: f('width') || E[0].scrollWidth || 0,
                        H: f('height') || E[0].scrollHeight || 0,
                        pX: v.pageX,
                        pY: v.pageY,
                        k: d.k
                        //o:E.css('opacity')
                    };
                    // also resize
                    if (E1 && d.k != 'd') {
                        M1 = {
                            X: p.left || f1('left') || 0,
                            Y: p.top || f1('top') || 0,
                            W: E1[0].offsetWidth || f1('width') || 0,
                            H: E1[0].offsetHeight || f1('height') || 0,
                            pX: v.pageX,
                            pY: v.pageY,
                            k: d.k
                        };
                    } else {
                        M1 = false;
                    }
                    //E.css({opacity:0.8});
                    if ($("input.hasDatepicker", E[0])[0]) {
                        try {
                            $("input.hasDatepicker", E[0]).datepicker('hide');
                        } catch (dpe) {
                        }
                    }
                    $(document).mousemove($.jqDnR.drag).mouseup($.jqDnR.stop);
                    return false;
                });
            });
        },
        f = function (k) {
            return parseInt(E.css(k), 10) || false;
        },
        f1 = function (k) {
            return parseInt(E1.css(k), 10) || false;
        };
    /*
     jQuery tinyDraggable v1.0.2
     Copyright (c) 2014 Simon Steinberger / Pixabay
     GitHub: https://github.com/Pixabay/jQuery-tinyDraggable
     More info: https://pixabay.com/blog/posts/p-52/
     License: http://www.opensource.org/licenses/mit-license.php
     */
    $.fn.tinyDraggable = function (options) {
        var settings = $.extend({handle: 0, exclude: 0}, options);
        return this.each(function () {
            var dx, dy, el = $(this), handle = settings.handle ? $(settings.handle, el) : el;
            handle.on({
                mousedown: function (e) {
                    if (settings.exclude && ~$.inArray(e.target, $(settings.exclude, el))) {
                        return;
                    }
                    e.preventDefault();
                    var os = el.offset();
                    dx = e.pageX - os.left, dy = e.pageY - os.top;
                    $(document).on('mousemove.drag', function (e) {
                        el.offset({top: e.pageY - dy, left: e.pageX - dx});
                    });
                },
                mouseup: function (e) {
                    $(document).off('mousemove.drag');
                }
            });
        });
    };
//module end
}));